package com.xhwl.centiotdata.handler.eesd.impl;

import com.alibaba.fastjson.JSONObject;
import com.xhwl.centiotdata.handler.eesd.EesdFactory;
import com.xhwl.centiotdata.handler.eesd.EesdHandler;
import com.xhwl.centiotdata.mq.producer.GeneralProducer;
import com.xhwl.centiotdata.pojo.dto.eesd.EesdConfigDTO;
import com.xhwl.centiotdata.pojo.enums.eesd.EesdMethodEnum;
import com.xhwl.centiotdata.service.cent.IBiEnvCentService;
import com.xhwl.centiotdata.service.cent.ICentAlarmService;
import com.xhwl.centiotdata.suppliersystem.eesd.lanju.LanjuApiHandler;
import com.xhwl.common.constant.cent.alarm.AlarmConstant;
import com.xhwl.common.dto.cent.device.DeviceDTO;
import com.xhwl.common.pojo.cent.alarm.AlarmManagement;
import com.xhwl.common.pojo.cent.bi.DwdFactEnvironmentMetrics;
import com.xhwl.common.pojo.cent.device.DeviceProjSupplierCategory;
import com.xhwl.common.utils.ChkUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author： lianghz
 * @Description：
 * @Date 2021/09/06/ 11:31
 */
@Slf4j
@Service
public class EesdLanJuHandler extends EesdHandler {

    @Autowired
    private LanjuApiHandler lanjuApiHandler;

    @Resource
    private IBiEnvCentService biEnvCentService;

    @Autowired
    ICentAlarmService iCentAlarmService;

    @Autowired
    GeneralProducer generalProducer;

    /**
     * id:产品id，来源cent_device库中device_product表中的数据
     * 8：上海蓝居-环境监测
     */
    @Override
    public void afterPropertiesSet() {
        EesdFactory.register(EesdMethodEnum.LANJU.getId(), this);
    }

    @Override
    public void pullRecord(EesdConfigDTO eesdConfigDTO) {
        //查询蓝居设备，并添加入库
        lanjuApiHandler.pullEnvDevice(eesdConfigDTO);
    }

    /**
     * 离线告警    在离线和同步设备分开。在离线10分钟一次
     */
    private void alarmOffline(DeviceProjSupplierCategory config) {
        List<DeviceDTO> lanjuDevice = lanjuApiHandler.getLanjuDevice(config.getProjectId());
        if (lanjuDevice != null && lanjuDevice.size() > 0) {
            DeviceDTO deviceDTO = lanjuDevice.get(0);

            AlarmManagement alarmManagement = new AlarmManagement();
            //组装公共部分数据
            alarmManagement.setProjectId(config.getProjectId());
            alarmManagement.setAlarmTime(new Date());
            alarmManagement.setDeviceId(deviceDTO.getId());
            //环境设备离线告警
            alarmManagement.setAlarmInventoryCode("56026090");
            generalProducer.send(AlarmConstant.IOT_ENVIRONMENT_TOPIC, alarmManagement);

        }
    }

    /**
     * 获取实时数据，并更新入库，判断是否有告警 ,十分钟一次
     * 调用位置:com.xhwl.centiotdata.pollingtrigger.eesd.EesdDispatcher#executeEnvOriginalData()
     *
     * @param config
     */
    @Override
    public void pullEnvData(DeviceProjSupplierCategory config) {
        try {
            Object o = lanjuApiHandler.pullEnvDevice(config);
            log.info("pullEnvData:==========" + o.toString());
            if (o == null) {
                alarmOffline(config);
            } else {
                if (o instanceof Map) {
                    Map map = (Map) o;
                    if (map.containsKey("is_online")) {
                        String is_online = ChkUtil.getString(map.get("is_online"));
                        if (!"在线".equalsIgnoreCase(is_online)) {
                            alarmOffline(config);
                        }
                    }
                }
            }

            List<DwdFactEnvironmentMetrics> list = lanjuApiHandler.pullEnvRecord(config);
            if (CollectionUtils.isEmpty(list)) {
                log.error("蓝居拉取环境实时数据到设备中台 失败： 数据为空");
                return;
            }
            String dataStr = JSONObject.toJSONString(list);
            //log.info("蓝居拉取环境实时数据 开始： {}", dataStr);
            biEnvCentService.pushEnvRealTimeData(dataStr);
            log.info("蓝居拉取环境实时数据 结束，" + dataStr);
            list.forEach(e->{
                iCentAlarmService.iotEnvironmentReceive(JSONObject.toJSONString(e));
            });
        } catch (Exception e) {
            log.error("蓝居拉取环境实时数据到设备中台 失败： {}", e.getMessage());
        }
    }

    /**
     * 趋势时间
     *
     * @param config
     */
    @Override
    public void pullEnvHourData(DeviceProjSupplierCategory config) {
        try {
            List<DwdFactEnvironmentMetrics> list = lanjuApiHandler.pullEnvRecord(config);
            if (CollectionUtils.isEmpty(list)) {
                log.error("蓝居拉取环境趋势数据到设备中台 失败： 数据为空");
                return;
            }
            String dataStr = JSONObject.toJSONString(list);
            //log.info("蓝居拉取环境趋势数据 开始： {}", dataStr);
            biEnvCentService.pushEnvHourData(dataStr);
            log.info("蓝居拉取环境趋势数据 结束");
        } catch (Exception e) {
            log.error("蓝居拉取环境趋势数据到设备中台 失败： {}", e.getMessage());
        }
    }

}
